﻿// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "AbilitySystemComponent.h"
#include "StarrySkyAbilitySystemComponent.generated.h"
DECLARE_MULTICAST_DELEGATE_OneParam(FEffectAssetTags, const FGameplayTagContainer& /*AssetTags*/);
/**
*ClassGroup=(Custom)
* 指定该类在编辑器中的分类组
* Custom 表示这个类属于"自定义"类别
* 在蓝图编辑器的组件列表中，该组件会出现在"Custom"分组下
*meta=(BlueprintSpawnableComponent)
* meta 是元数据标签，用于提供额外的编辑器信息
* BlueprintSpawnableComponent 表示这个组件可以在蓝图中被创建和使用
* 允许设计师在蓝图编辑器中将此组件添加到 Actor 上
 **/
UCLASS(ClassGroup=(Custom), meta=(BlueprintSpawnableComponent))
class STARRYSKY_API UStarrySkyAbilitySystemComponent : public UAbilitySystemComponent
{
	GENERATED_BODY()

public:
	void AbilityActorInfoSet();

	//赋予启动能量
	void AddCharacterAbilities(const TArray<TSubclassOf<UGameplayAbility>> StartupAbilities);
	//广播游能量附加的游戏标签的委托对象
	FEffectAssetTags EffectAssetTags;
	
	//能力输入方法
	void AbilityInputTagPressed(const FGameplayTag& InputTag);
	void AbilityInputTagHeld(const FGameplayTag& InputTag);
	void AbilityInputTagReleased(const FGameplayTag& InputTag);
protected:
	//这个方法变为客户端的RPC方法，保证服务器执行效果委托的时候可以绑定执行到客户端的这个方法中
	UFUNCTION(Client, Reliable)
	void ClientEffectApplied(UAbilitySystemComponent* AbilitySystemComponent, const FGameplayEffectSpec& EffectSpec, FActiveGameplayEffectHandle ActiveEffectHandle) const;
};
